package cn.jasonone.jasonfx.util;

import cn.jasonone.jasonfx.annotation.FXController;
import cn.jasonone.jasonfx.entity.JFXBaseController;
import lombok.NonNull;

/**
 * 控制器工具
 * 
 * @author Jason
 * @date: 2020-01-23 16:52
 */
public class ControllerUtil {
	/**
	 * 获取控制器名称
	 * 
	 * @param type 控制器类
	 * @return 名称
	 */
	public static String getControllerName(@NonNull Object object) {
		return getControllerName(object.getClass());
	}

	/**
	 * 获取控制器名称
	 * 
	 * @param type 控制器类
	 * @return 名称
	 */
	public static String getControllerName(Class<?> type) {
		String controllerName = null;
		type = ClassUtil.getClass(type);
		if (isController(type)) {
			FXController controller = AnnotationUtil.getAnnotation(type, FXController.class);
			if (StringUtil.isNotEmpty(controller.name())) {
				controllerName = controller.name();
			} else {
				controllerName = type.getSimpleName();
				controllerName = Character.toLowerCase(controllerName.charAt(0)) + controllerName.substring(1);
			}
		}
		return controllerName;
	}

	/**
	 * 检测是否为控制器
	 * 
	 * @param controller 待检测对象
	 * @return boolean
	 */
	public static boolean isController(Object controller) {
		if (controller == null)
			return false;
		return isController(controller.getClass());
	}

	/**
	 * 检测是否为控制器类
	 * 
	 * @param type 待检测类
	 * @return boolean
	 */
	public static boolean isController(Class<?> type) {
		if (type == null)
			return false;
		if (AnnotationUtil.isAnnotations(type, FXController.class)) {
			if (ClassUtil.isAbstract(type) || ClassUtil.isInterface(type)) {
				return false;
			} else if (JFXBaseController.class.isAssignableFrom(type)) {
				return true;
			}
		}
		return false;
	}
}
